import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

# ---------------------------
# 1. 解决中文乱码问题
# ---------------------------
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用微软雅黑显示中文
plt.rcParams['axes.unicode_minus'] = False              # 解决负号显示为方框的问题
sns.set_theme(style="whitegrid", font='Microsoft YaHei')

# ---------------------------
# 2. 固定爬虫日期及构建 Excel 文件路径
# ---------------------------
clawer_date = "2025-05-20"  # 固定爬虫日期

# 构建两个 Excel 文件路径
file_path_xd = os.path.join("F:\\network-collect\\putout", clawer_date, "西安-大连.xlsx")
file_path_dx = os.path.join("F:\\network-collect\\putout", clawer_date, "大连-西安.xlsx")

# 检查文件是否存在
for fp in [file_path_xd, file_path_dx]:
    if not os.path.exists(fp):
        print("无法找到 Excel 文件：", fp)
        exit()

# ---------------------------
# 3. 读取 Excel 数据
# ---------------------------
df_xd = pd.read_excel(file_path_xd, engine='openpyxl')
df_dx = pd.read_excel(file_path_dx, engine='openpyxl')

# 如果票价列为字符串，转换为数值（剔除非数字字符）
if df_xd['票价'].dtype == object:
    df_xd['票价'] = pd.to_numeric(df_xd['票价'], errors='coerce')
if df_dx['票价'].dtype == object:
    df_dx['票价'] = pd.to_numeric(df_dx['票价'], errors='coerce')

# 将 '出发时间'（格式 "HH:MM:SS"）转换为小时，生成新列 ‘出发时间_时’
df_xd['出发时间_时'] = pd.to_datetime(df_xd['出发时间'], format="%H:%M:%S", errors='coerce').dt.hour
df_dx['出发时间_时'] = pd.to_datetime(df_dx['出发时间'], format="%H:%M:%S", errors='coerce').dt.hour

# =============================================================================
# 图1：各航空公司的航班数量柱状图
# =============================================================================
fig1, axes1 = plt.subplots(1, 2, figsize=(16, 6))

sns.countplot(ax=axes1[0], data=df_xd, x='航空公司', order=df_xd['航空公司'].value_counts().index, hue='航空公司', palette="viridis", legend=False)
axes1[0].set_title("西安-大连 各航空公司航班数量")
axes1[0].set_xlabel("航空公司")
axes1[0].set_ylabel("航班数量")
axes1[0].tick_params(axis='x', rotation=45)

sns.countplot(ax=axes1[1], data=df_dx, x='航空公司', order=df_dx['航空公司'].value_counts().index, hue='航空公司', palette="viridis", legend=False)
axes1[1].set_title("大连-西安 各航空公司航班数量")
axes1[1].set_xlabel("航空公司")
axes1[1].set_ylabel("航班数量")
axes1[1].tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

# =============================================================================
# 图2：票价分布直方图及核密度曲线
# =============================================================================
fig2, axes2 = plt.subplots(1, 2, figsize=(16, 6))

sns.histplot(ax=axes2[0], data=df_xd, x='票价', bins=20, kde=True, color="skyblue")
axes2[0].set_title("西安-大连 票价分布")
axes2[0].set_xlabel("票价")
axes2[0].set_ylabel("数量")

sns.histplot(ax=axes2[1], data=df_dx, x='票价', bins=20, kde=True, color="skyblue")
axes2[1].set_title("大连-西安 票价分布")
axes2[1].set_xlabel("票价")
axes2[1].set_ylabel("数量")

plt.tight_layout()
plt.show()

# =============================================================================
# 图3：出发时间分布（按小时）的柱状图
# =============================================================================
fig3, axes3 = plt.subplots(1, 2, figsize=(16, 6))

sns.countplot(ax=axes3[0], data=df_xd, x='出发时间_时', order=range(24), hue='出发时间_时', palette="mako", legend=False)
axes3[0].set_title("西安-大连 出发时间分布（按小时）")
axes3[0].set_xlabel("小时")
axes3[0].set_ylabel("航班数量")

sns.countplot(ax=axes3[1], data=df_dx, x='出发时间_时', order=range(24), hue='出发时间_时', palette="mako", legend=False)
axes3[1].set_title("大连-西安 出发时间分布（按小时）")
axes3[1].set_xlabel("小时")
axes3[1].set_ylabel("航班数量")

plt.tight_layout()
plt.show()

# =============================================================================
# 图4：出发时间与票价的散点图
# =============================================================================
fig4, axes4 = plt.subplots(1, 2, figsize=(16, 6))

sns.scatterplot(ax=axes4[0], data=df_xd, x='出发时间_时', y='票价', color="coral")
axes4[0].set_title("西安-大连 出发时间与票价关系")
axes4[0].set_xlabel("出发时间（小时）")
axes4[0].set_ylabel("票价")

sns.scatterplot(ax=axes4[1], data=df_dx, x='出发时间_时', y='票价', color="coral")
axes4[1].set_title("大连-西安 出发时间与票价关系")
axes4[1].set_xlabel("出发时间（小时）")
axes4[1].set_ylabel("票价")

plt.tight_layout()
plt.show()
